package com.runvp.common.pay;

import com.alibaba.fastjson.JSONObject;
import com.huifu.adapay.Adapay;
import com.huifu.adapay.model.MerConfig;
import com.runvp.common.config.AdaPayConfig;
import com.runvp.common.enums.AdapayPayStatus;
import com.runvp.common.exception.base.BaseException;
import com.runvp.common.util.OrderNoUtils;
import com.runvp.common.util.ToolUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;


/**
 * @author xkk
 */
@Slf4j
public class MainPay {
    public static void main(String[] args) throws Exception {
        //若是商户只是自己对接adapay，请使用如下demo
        OrderCreateModel model = new OrderCreateModel();
        model.setOpenId("o18065S70KXjUaBHoR0fvn5tI4Dw");
        model.setOrderNo(OrderNoUtils.getOrderNo());
        model.setGoodsTitle("洗衣液");
        model.setGoodsDesc("蓝之海洗衣液");
        model.setPayAmt("2.00");
//        merchantPay(model);
        merchantQRPay(model);
    }

    /**
     * 创建支付对象
     * @param model
     * @return json
     */
    public static JSONObject merchantPay(OrderCreateModel model)  {
        long st = System.currentTimeMillis();
        try{
            //debug 模式，开启后有详细的日志
            Adapay.debug = true;
            //prodMode 模式，默认为生产模式，false可以使用mock模式
            Adapay.prodMode = false;
            /**
             * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
             * apiKey为prod模式的API KEY
             * mockApiKey为mock模式的API KEY
             * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
             */
            String apiKey = AdaPayConfig.getApiKey();
            String mockApiKey = AdaPayConfig.getMockApiKey();
            String rsaPrivateKey = AdaPayConfig.getRsaPrivateKey();
            MerConfig merConfig = new MerConfig();
            merConfig.setApiKey(apiKey);
            merConfig.setApiMockKey(mockApiKey);
            merConfig.setRSAPrivateKey(rsaPrivateKey);
            Adapay.initWithMerConfig(merConfig);
            //初始化完成，可以开始交易
            String appId = AdaPayConfig.getAppId();
            // 运行支付类接口
            Map<String, Object> res = PaymentUtil.executePayment(appId,model);
            log.info("res:{}" , JSONObject.toJSONString(res));
            if(!AdapayPayStatus.PAY_SUCCEEDED.getCode().equals(ToolUtils.toStr(res.get("status")))){
                return null;
            }
            String query_url = ToolUtils.toStr(res.get("query_url"));
            JSONObject json = JSONObject.parseObject(res.get("expend").toString()).getJSONObject("pay_info");
            json.putAll(res);
            json.put("queryUrl",query_url);
            log.info("json:{}" , json.toJSONString());
            return json;
        }catch (Exception e){
            log.error("merchantPay:{}",e.getMessage());
            return null;
        }finally {
            log.info("支付创建完毕,共耗时:{}",(System.currentTimeMillis()-st)+" ms");
        }
    }
    /**
     * 退款
     * @param model
     * @return json
     */
    public static JSONObject refund(OrderRefundModel model)  {
        try{
            //debug 模式，开启后有详细的日志
            Adapay.debug = true;
            //prodMode 模式，默认为生产模式，false可以使用mock模式
            Adapay.prodMode = false;
            /**
             * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
             * apiKey为prod模式的API KEY
             * mockApiKey为mock模式的API KEY
             * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
             */
            String apiKey = AdaPayConfig.getApiKey();
            String mockApiKey = AdaPayConfig.getMockApiKey();
            String rsaPrivateKey = AdaPayConfig.getRsaPrivateKey();
            MerConfig merConfig = new MerConfig();
            merConfig.setApiKey(apiKey);
            merConfig.setApiMockKey(mockApiKey);
            merConfig.setRSAPrivateKey(rsaPrivateKey);
            Adapay.initWithMerConfig(merConfig);
            return (JSONObject) PaymentUtil.refund(model);
        }catch (Exception e){
            log.error("refund:{}",e.getMessage());
            log.error("订单【{}】退款失败",model.getRefund_order_no(),e);
            throw new BaseException("退款失败");
        }finally {

        }
    }
    /**
     * 退款查询
     * @param model
     * @return json
     */
    public static JSONObject refundQuery(OrderRefundModel model)  {
        try{
            //debug 模式，开启后有详细的日志
            Adapay.debug = true;
            //prodMode 模式，默认为生产模式，false可以使用mock模式
            Adapay.prodMode = false;
            /**
             * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
             * apiKey为prod模式的API KEY
             * mockApiKey为mock模式的API KEY
             * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
             */
            String apiKey = AdaPayConfig.getApiKey();
            String mockApiKey = AdaPayConfig.getMockApiKey();
            String rsaPrivateKey = AdaPayConfig.getRsaPrivateKey();
            MerConfig merConfig = new MerConfig();
            merConfig.setApiKey(apiKey);
            merConfig.setApiMockKey(mockApiKey);
            merConfig.setRSAPrivateKey(rsaPrivateKey);
            Adapay.initWithMerConfig(merConfig);
            return (JSONObject) PaymentUtil.refundQuery(model);
        }catch (Exception e){
            log.error("refund:{}",e);
            log.error("订单【{}】退款失败",model.getRefund_order_no(),e);
            throw new BaseException("退款失败");
        }finally {

        }

    }
    /**
     * 二维码支付
     * @param model
     * @return json
     */
    public static JSONObject merchantQRPay(OrderCreateModel model)  {
        long st = System.currentTimeMillis();
        try{
            //debug 模式，开启后有详细的日志
            Adapay.debug = true;
            //prodMode 模式，默认为生产模式，false可以使用mock模式
            Adapay.prodMode = false;
            /**
             * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
             * apiKey为prod模式的API KEY
             * mockApiKey为mock模式的API KEY
             * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
             */
            String apiKey = "api_live_48427a29-0091-4ca3-82b2-11fd39891b20";
            String mockApiKey = "api_test_927dac45-6013-439b-ad1e-338258d5bb56";
            String rsaPrivateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIlSS6Agsv43Xn4OF6vabKrz7Us3JRMT2ZaFj+2CsoQ3Javn2CoWJ0O0grR9TpA+8DUUBC9jOz8aG9x2EKoe2ZSmNocG7poQUdO4+IeotM4gBssPdFy9HsN0xom2qRpcbQNPAS8yscp/7DwOlvYjKhh0eluRLfNbDyEFLxZz61TRAgMBAAECgYBMMC2nTR0iMIQruhPmFEzgWG/aoGDggc3iVn4xT6dN9e7fvsVPLHVieh9elntlSpYpTM65n/u6GflFSvgZ+v3KTJFu3kvxVuR6aCIF5tf0siiWyYjeQew/npxxbUI0CEW3VIFV+88+ma+CUA/zFCYMO8JvAMuitynHzXCoiXm4hQJBAL1gO17ULEGyvkVkojTKOyGH5tkADd16Hymp0YJgxAa6/OJ7oRCN65+Ppb5m2dMB4FtNitBhy0yEeuPhTv4N17cCQQC5oeIF0iAdwg8W74c+on1ZzVK4PdSBA94udPU/X7zj+Mj3OqlveLLm4WKhweeNA67ohwjCPksrU6YSfMK4oOe3AkBGbx9F0tYvDUL1XktyJPE/NGOou/tsL3qdrVqOCl1+P1fFCMRL+uzy6KN1oJ1NfLosWzfQ7z6E1BU84lTV6uIbAkEAkp7em6JgY6DHsmH2/O3y/F9EmumbU1vuvdr7atb/p0D12vCmq7k19U7ITOOPNL5YBKnDrUjuroYfgjKwyous+QJAFm3Z6W6OuCvnfo2gRE4Mm223F+L5FtfLpQKi8fUXaffhrQuJbkAQxGL65ONBJB2luUwdnz1QPkMAzo67v5erZA==";
            MerConfig merConfig = new MerConfig();
            merConfig.setApiKey(apiKey);
            merConfig.setApiMockKey(mockApiKey);
            merConfig.setRSAPrivateKey(rsaPrivateKey);
            Adapay.initWithMerConfig(merConfig);
            //初始化完成，可以开始交易
            String appId = "app_d53f51a0-28cd-4948-ade2-eae5d343a0ea";
            // 运行支付类接口
            JSONObject res = (JSONObject) PaymentUtil.executeQRPayment(appId,model);
            log.info("res:{}" , JSONObject.toJSONString(res));
            if(!"succeeded".equals(res.getString("status"))){
                return null;
            }
            String notify_url = res.getString("notify_url");
            JSONObject json = res.getJSONObject("expend");
            json.put("notify_url",notify_url);
            log.info("json:{}" , json.toJSONString());
            return json;
        }catch (Exception e){
            log.error("merchantPay:{}",e);
            return null;
        }finally {
            log.info("支付创建完毕,共耗时:{}",(System.currentTimeMillis()-st)+" ms");
        }
    }
}